package com.rq.base.util;

import android.app.Application;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Parcelable;

import com.rq.base.BASE;
import com.tencent.mmkv.MMKV;

import java.io.Serializable;
import java.util.Set;

/**
 * 小数据手机本地存储
 */
public class SPUtil {
    private static MMKV mkv;
    private static String appId;

    public static void setAppId(String c) {
        appId = c;
    }

    public static final String TAG_INNER_PRINTER = "send.printer.is.usable";

    public static void setInnerPrinter(boolean isOpen) {
        if (mkv == null) {
            return;
        }
        mkv.putBoolean(TAG_INNER_PRINTER, isOpen);
    }

    /**
     * @return 设备内置打印可用
     */
    public static boolean isInnerPrinterOk() {
        if (mkv == null) {
            return false;
        }
        return mkv.getBoolean(TAG_INNER_PRINTER, false);
    }

    private SPUtil() {
    }

    public static SPUtil getInstance() {
        return SingletonHolder.sInstance;
    }  //静态内部类

    private static class SingletonHolder {
        private static final SPUtil sInstance = new SPUtil();
    }

    public static void init(Context context) {
        appId = context.getPackageName();
        MMKV.initialize(context);
        mkv = MMKV.mmkvWithID("user");
    }


    /**
     * 保存数据的方法，我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
     *
     * @param key
     * @param object
     */
    private static void save(String key, Object object) {
        if (key == null) {
            return;
        }
        key = appId + key;
        if (object == null) {
            removeKey(key);
            return;
        }
        if (object instanceof String) {
            mkv.encode(key, (String) object);
        } else if (object instanceof Integer) {
            mkv.encode(key, (Integer) object);
        } else if (object instanceof Boolean) {
            mkv.encode(key, (Boolean) object);
        } else if (object instanceof Float) {
            mkv.encode(key, (Float) object);
        } else if (object instanceof Long) {
            mkv.encode(key, (Long) object);
        } else if (object instanceof Double) {
            mkv.encode(key, (Double) object);
        } else if (object instanceof byte[]) {
            mkv.encode(key, (byte[]) object);
        } else if (object instanceof Parcelable) {
            mkv.encode(key, (Parcelable) object);
        } else {
            mkv.encode(key, object.toString());
        }
    }

    public static void saveSet(String key, Set<String> sets) {
        mkv.encode(key, sets);
    }

    public static void saveParcelable(String key, Parcelable obj) {
        mkv.encode(key, obj);
    }

    /**
     * 得到保存数据的方法，我们根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
     *
     * @param key
     * @param defaultObject
     * @return
     */
    public static Object getCash(String key, Object defaultObject) {
        key = appId + key;
        if (defaultObject instanceof String) {
            return mkv.decodeString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return mkv.decodeInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return mkv.decodeBool(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return mkv.decodeFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return mkv.decodeLong(key, (Long) defaultObject);
        } else if (defaultObject instanceof Double) {
            return mkv.decodeDouble(key, (Double) defaultObject);
        } else if (defaultObject instanceof byte[]) {
            return mkv.decodeBytes(key, (byte[]) defaultObject);
        } else if (defaultObject instanceof Serializable) {
            return mkv.decodeParcelable(key, (Class<? extends Parcelable>) defaultObject);
        }
        return defaultObject;
    }

    /**
     * 移除某个key对
     *
     * @param key
     */
    public static void removeKey(String key) {
        mkv.removeValueForKey(key);
    }

    /**
     * 移除多个key对
     *
     * @param key
     */
    public static void removeKeys(String[] key) {
        mkv.removeValuesForKeys(key);
    }

    /**
     * 获取全部key对
     */
    public static String[] getAllKeys() {
        return mkv.allKeys();
    }

    /**
     * 含有某个key
     *
     * @param key
     * @return
     */
    public static boolean hasKey(String key) {
        return mkv.containsKey(key);
    }

    /**
     * 含有某个key
     *
     * @param key
     * @return
     */
    public static boolean have(String key) {
        return mkv.contains(key);
    }

    /**
     * 清除所有key
     */
    public static void clearAll() {
        mkv.clearAll();
    }

    /**
     * 获取操作对象
     *
     * @return
     */
    public static MMKV getMkv() {
        return mkv;
    }


    public static String getString(String key) {
        key = appId + key;
        return (String) getString(key, "");
    }


    public static String getString(String key, String defaultValue) {
        key = appId + key;
        return (String) getCash(key, defaultValue);
    }

    public static void saveString(String key, String value) {
        key = appId + key;
        save(key, value);
    }

    public static void clearStrings(String... key) {
        removeKeys(key);
    }

    public static void saveInt(String key, int value) {
        key = appId + key;
        save(key, value);
    }

    public static int getInt(String key) {
        key = appId + key;
        return (int) getCash(key, -1);
    }

    public static int getInt(String key, int defaultValue) {
        key = appId + key;
        return (int) getCash(key, defaultValue);
    }

    public static long getLong(String key, long defaultValue) {
        key = appId + key;
        return (long) getCash(key, defaultValue);
    }


    public static void setString(String key, String value) {
        key = appId + key;
        save(key, value);
    }


    public static void setBoolean(String key, Boolean b) {
        key = appId + key;
        save(key, b);
    }

    public static boolean getBoolean(String key) {
        key = appId + key;
        //    return init(context).getBoolean(key, false);
        return (boolean) getCash(key, false);
    }

    public static void setLong(String key, Long b) {
        key = appId + key;
        save(key, b);
    }

    public static Long getLong(String key, long... defaultValue) {
        key = appId + key;
        long def = 0;
        if (defaultValue != null && defaultValue.length == 1) {
            def = defaultValue[0];
        }
        return (Long) getCash(key, def);
    }


    //  public static SharedPreferences init(Context context) {
    //    if (context == null) {
    //      LOG.e("SPUtil", "ERROR : Line 14");
    //    }
    //    SharedPreferences sp = context.getSharedPreferences("user", Context.MODE_PRIVATE);
    //    return sp;
    //  }
    //
    //  private static Context context;
    //
    //  public static void setCxt(Application context) {
    //    SPUtil.context = context;
    //  }
    //
    //  public static String getString( String key) {
    //    return init(context).getString(key, "");
    //  }
    //
    //  /**
    //   * 添加数据
    //   *
    //   * @param key
    //   * @param value
    //   */
    //  public static void saveString( String key, String value) {
    //    SharedPreferences.Editor edit = init(context).edit();
    //    edit.putString(key, value);
    //    edit.apply();
    //  }
    //
    //  public static void clearStrings( String... key) {
    //    if (context != null && key != null && key.length > 0) {
    //      SharedPreferences.Editor edit = init(context).edit();
    //      for (String k : key) {
    //        edit.remove(k);
    //      }
    //      edit.apply();
    //    }
    //  }
    //
    //  public static void saveString(String key, String value) {
    //    saveString(context, key, value);
    //  }
    //
    //  public static void saveInt(String key, int value) {
    //    saveInt(context, key, value);
    //  }
    //
    //  public static void saveInt( String key, int value) {
    //    SharedPreferences.Editor edit = init(context).edit();
    //    edit.putInt(key, value);
    //    edit.apply();
    //  }
    //
    //  public static int getInt( String key, int defaultValue) {
    //    return init(context).getInt(key, defaultValue);
    //  }
    //
    //  public static int getInt( String key) {
    //    return init(context).getInt(key, -1);
    //  }
    //
    //  public static void setString(Context welcomeActivity, String key, String value) {
    //    SharedPreferences.Editor edit = init(welcomeActivity).edit();
    //    edit.putString(key, value);
    //    edit.apply();
    //  }
    //
    //  public static String getString(String key) {
    //    return init(context).getString(key, "");
    //  }
    //
    //
    //  public static void setBoolean( String key, Boolean b) {
    //    SharedPreferences.Editor edit = init(context).edit();
    //    edit.putBoolean(key, b);
    //    edit.apply();
    //  }
    //
    //  public static boolean getBoolean( String key) {
    //    return init(context).getBoolean(key, false);
    //  }
    //
    //  public static void setLong( String key, Long b) {
    //    SharedPreferences.Editor edit = init(context).edit();
    //    edit.putLong(key, b);
    //    edit.apply();
    //  }
    //
    //  public static Long getLong( String key, long defaultValue) {
    //    return init(context).getLong(key, defaultValue);
    //  }
    //
    //  public static Long getLong( String key) {
    //    return init(context).getLong(key, 0L);
    //  }

}
